package com.stephen.redisdemo.reference;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

/**
 * @author: stephen
 * @create: 2020-03-03 15:33
 * @description: 引用队列
 * 四个引用对象都可以配合引用队列 使用
 * 在被GC回收时,会被放到引用队列中
 * 虚引用(PhantomReference),在每次get()时,都是null
 * 只有在被GC回收到,引用队列中,才有值
 */
public class ReferenceQueueDemo {

    public static void main(String[] args) {
        Object obj = new Object();
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
        // 虚引用配合引用队列的使用
        PhantomReference<Object> weakReference = new PhantomReference<>(obj,referenceQueue);
        System.out.println(obj); // java.lang.Object@3ffc5af1
        System.out.println(weakReference.get()); // null
        System.out.println(referenceQueue.poll()); // null
        obj = null;
        System.gc();

        System.out.println("------GC之后------");
        System.out.println(obj); // null
        System.out.println(weakReference.get()); // null
        System.out.println(referenceQueue.poll()); // java.lang.ref.WeakReference@5e5792a0
    }
}
